package gemsa.servlets.administrateur;

import java.io.IOException;
import java.util.List;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import gemsa.modeles.ModeleReponse;
import gemsa.modeles.ModeleQuestion;
import gemsa.outils.GestionDroit;
import gemsa.beans.Reponse;
import gemsa.beans.Question;

/**
 * Classe ServletGestionReponses
 * @author Projet Dev Groupe 33
 * @version 1.0 Finale
 */

@SuppressWarnings("serial")
public class ServletGestionReponses extends HttpServlet 
{
	// Variables de la classe
	private DataSource datasource=null;
	private GestionDroit gestionDroit=null;
	
	// Traitements
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{		
		// Initialisation de la gestion des droits
		gestionDroit=new GestionDroit(request);
		
		// On autorise uniquement les administrateurs
		if(gestionDroit.estAutorise(true,false,false))
		{
			// R�cup�rer l'objet datasource du context de la servlet
			datasource=(DataSource)getServletContext().getAttribute("datasource");
			
			// Action � r�aliser
			String action=(String)request.getParameter("action");
			
			// Action par d�faut (liste)
			if(action==null || action.equalsIgnoreCase(""))
			{
				action="lister";
			}
			
			// Listing des reponses
			if(action.equals("lister"))
			{
				lister(request,response);
			}
			
			// Consulter une reponse
			if(action.equals("consulter"))
			{
				consulter(request,response);
			}
			
			// Formulaire d'ajout d'une reponse
			if(action.equals("ajouter"))
			{
				ajouter(request,response);
			}
			
			// Validation du formulaire d'ajout
			if(action.equals("validerajout"))
			{
				validerAjout(request,response);
			}
			
			// Suppression d'une reponse
			if(action.equals("supprimer"))
			{
				supprimer(request, response);
			}
			
			// Formulaire de modification d'une reponse
			if(action.equals("modifier"))
			{
				modifier(request, response);
			}
			
			// Validation du formulaire de modification
			if(action.equals("validermodification"))
			{
				validerModification(request, response);
			}

		}
		else
		{
			getServletContext().getRequestDispatcher("/pageFixe?action=erreur&erreurs=Vous n'�tes pas autoris� � afficher cette page!!").forward(request, response);
		}	
		
		// Vider le datasource
		this.datasource=null;
	}
	
	
	
	
	// Lister les reponses
	private void lister(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		int page=0;
		int maxParPage=0;
		ModeleReponse modeleReponse=null;
		ArrayList<Reponse> listeReponses=null;
		
		try 
		{
			// On r�cup�re la page demand�e
			page=Integer.parseInt(request.getParameter("page").trim());
			
			// Si la page vaut 0 ou inf�rieur on prend la valeur 1
			page=Math.max(page, 1);
		}
		catch (Exception e) 
		{
			// Si dans la requete l'attribut page n'est pas un nombre, on initialise la page � 1
			page=1;
		}
		
		try 
		{
			// On r�cup�re le maximum d'�l�ments a afficher
			maxParPage=Integer.parseInt(request.getParameter("maxParPage").trim());
			
			// Si maxParPage est inf�rieur � 5, on renvoie 5
			maxParPage=Math.max(maxParPage, 5);
		}
		catch (Exception e) 
		{
			// Si dans la requete le param�tre n'est pas un nombre, on initialise le maximum d'�l�ment � 20
			maxParPage=20;
		}
		
		// On initialise le mod�le
		modeleReponse=new ModeleReponse(datasource);
		
		// On r�cup�re la liste des reponses avec le mod�le
		listeReponses=(ArrayList<Reponse>)modeleReponse.listeReponseAdmin(maxParPage, page);
		
		// On renvoie � la JSP la liste des reponses obtenus ainsi que les informations de pagination
		request.setAttribute("listeReponses",listeReponses);
		request.setAttribute("maxParPage", modeleReponse.getMaxParPage());
		request.setAttribute("pageActuel", modeleReponse.getPageActuel());
		request.setAttribute("totalElement", modeleReponse.getTotalElement());

		// On renvoie de plus � la vue les messages d'erreurs et ou de succ�s
		request.setAttribute("succes",(String)request.getParameter("succes"));
		request.setAttribute("erreurs",(String)request.getParameter("erreurs"));
		
		// On vide la liste des reponses par s�curit�
		listeReponses=null;
		
		// On renvoie la page de listing des reponses
		getServletContext().getRequestDispatcher("/vues/administrateurs/listereponses.jsp").forward(request,response);
	}
	
	
	// Consulter une reponse
	private void consulter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleReponse modeleReponse=null;
		int idReponse=0;
		Reponse reponse=null;
		
		try
		{
			// On r�cup�re l'id de la reponse
			idReponse=Integer.parseInt(request.getParameter("idReponse"));
		}
		catch (Exception e) 
		{
			// Si l'id de la reponse pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idReponse=0;
		}
		
		// On initialise le mod�le
		modeleReponse=new ModeleReponse(datasource);
		
		// On r�cup�re la reponse correspondante, renvoie null si l'id de la reponse n'existe pas dans la base
		reponse=(Reponse)modeleReponse.getReponse(idReponse);
		
		// Si l'objet reponse est null (id non trouv�) on renvoie sur la page de listing avec un message d'erreur
		if(reponse!=null)
		{
			// On renvoie � la JSP la reponse demand�e
			request.setAttribute("reponse",reponse);
			
			// On vide la reponse par s�curit�
			reponse=null;
			
			// On renvoie � la vue de consultation des informations d'une reponse
			getServletContext().getRequestDispatcher("/vues/administrateurs/consulterreponse.jsp").forward(request,response);
		}
		else
		{
			// On renvoie la page de liste des reponses avec un message d'erreur
			response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Cette reponse n'est pas r�f�renc�e dans la base");
		}
	}
	
	
	
	// Ajouter une reponse
	private void ajouter(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		List<Question> listeQuestion=null;
		ModeleQuestion modeleQuestion=null;
		
		// Initialisation du mod�le
		modeleQuestion=new ModeleQuestion(this.datasource);
		
		// On r�cup�re la liste des questions depuis le mod�le
		listeQuestion=modeleQuestion.listeQuestion();
		
		// On place dans la requ�te la liste des questions
		request.setAttribute("question", listeQuestion);
		
		// on renvoie � la vue d'ajout d'une reponse
		getServletContext().getRequestDispatcher("/vues/administrateurs/ajouterreponse.jsp").forward(request,response);
	}
	
	
	// Valider l'ajout d'une reponse
	private void validerAjout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleQuestion modeleQuestion=null;
		List<Question> listeQuestion=null;
		Enumeration parametres=null;
		String parametre=null;
		List<String> erreurs=null;
		String nom=null;
		String coefficient=null;
		Reponse reponse=null;
		ModeleReponse modeleReponse=null;
		int codeErreur=0;
		
				
		// On initialise les mod�les
		modeleReponse=new ModeleReponse(this.datasource);
		modeleQuestion=new ModeleQuestion(this.datasource);
		
		// On r�cup�re les informations du formualire sur lesquels on va appliquer une validation
		nom=request.getParameter("nom").trim();
		coefficient=request.getParameter("coefficient").trim();
		
		// On ajoute tous les attributs du formulaire dans la requ�te soit pour les transf�rer � la vue
		parametres=request.getParameterNames();
		while (parametres.hasMoreElements()) 
		{
			parametre=(String)parametres.nextElement();
		    request.setAttribute(parametre,(String)request.getParameterValues(parametre)[0]);
		}

		// Initialisation de la collection d'erreurs
		erreurs=new ArrayList<String>();
		
		// On v�rifie que le nom est renseign�
		if(nom.trim().equals("") || nom==null)
		{
			erreurs.add("Le param�tre [nom] est vide");
		}
		else if (nom.trim().length()<5)
		{
			// Test de la longeur du nom (5 caract�re minimum)
			erreurs.add("Le param�tre [nom] doit contenir au moin 5 caract�res");
		}
		else if (!nom.trim().matches("^[\\p{L}\\s\\d-']{5,}$"))
		{
			erreurs.add("Le param�tre [nom] contient une erreur de syntaxe");
		}
		
		// On v�rifie que le coefficient est renseign�
		if(coefficient.trim().equals("") || coefficient == null)
		{
			erreurs.add("Le param�tre [coefficient] est vide");
		}
		else if(!coefficient.trim().matches("^(\\d){1,}((\\.){1,1}(\\d){1,2})?$"))
		{
			erreurs.add("Le param�tre [coefficient] contient une erreur de syntaxe");
		}
		
		// On regarde le nombre d'erreurs, s'il y en a au moins une on retourne � la page d'ajout
		if(erreurs.size() > 0)
		{	
			// On initialise le modele de question
			modeleQuestion=new ModeleQuestion(datasource);
			
			// On r�cup�re la liste des questions
			listeQuestion=modeleQuestion.listeQuestion();
			
			// On place la liste dans la requ�te
			request.setAttribute("question", listeQuestion);
			
			// On ajoute la collection d'erreurs
			request.setAttribute("erreurs", erreurs);
			
			// On renvoie � la vue d'ajout d'une reponse
			getServletContext().getRequestDispatcher("/vues/administrateurs/ajouterreponse.jsp").forward(request,response);
		}
		// Si aucune erreur, on modifie dans la base de donn�es
		else
		{
			// On initialise la nouvelle reponse � ajouter
			reponse=new Reponse();
					
			// On d�finit les attributs de la reponse avec les informations fournit dans les deux formulaires pr�c�dent
			reponse.setQuestion(modeleQuestion.getQuestion(Integer.parseInt(request.getParameter("question").trim())));
			reponse.setNom(request.getParameter("nom").trim());
			reponse.setDescription(request.getParameter("description").trim());
			reponse.setCoefficient(Double.parseDouble(request.getParameter("coefficient").trim()));
			reponse.setEtat(Integer.parseInt(request.getParameter("etat").trim()));

			// On ajoute la reponse � la base de donn�es en passant par le mod�le
			codeErreur=modeleReponse.ajouterReponse(reponse);
			
			// On vide l'objet reponse par s�curit�
			reponse=null;
				
			// On teste le code de retour pour afficher un message de succ�s ou d'erreur
			if(codeErreur!=1)
			{		
				// On renvoie � la page de liste des reponses avec un message d'erreur
				response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Une erreur s'est produite durant l'ajout de la reponse, veuillez recommencer");
			}
			else
			{	
				// On renvoie � la page de liste des reponses avec un message d'erreur
				response.sendRedirect("administrationReponses?action=lister&succes=" + "La reponse � �t� ajout�e avec succ�s");
			}
		}
	}
	
	// Supprimer une reponse
	private void supprimer(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleReponse modeleReponse=null;
 		int idReponse=0;
		int codeErreur=0;
	
		try
		{
			// On r�cup�re l'id de la reponse
			idReponse=Integer.parseInt(request.getParameter("idReponse"));
		}
		catch (Exception e) 
		{
			// Si l'id de la reponse pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idReponse=0;
		}
		
		// On initialise le mod�le
		modeleReponse=new ModeleReponse(this.datasource);
		
		// Si la reponse existe on la supprime
		if(modeleReponse.getReponse(idReponse)!=null)
		{
			// On envoie au mod�le l'id de la reponse � supprimer, renvoie 1 si la reponse a bien �t� supprim�
			codeErreur=modeleReponse.supprimerReponse(idReponse);
			
			// On vide l'id de la reponse par s�curit�
			idReponse=0;
			
			// On teste le code de retour pour afficher un message de succes ou d'erreur
			if(codeErreur!=1)
			{		
				// On renvoie � la page de liste des reponses avec un message d'erreur
				response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Une erreur s'est produite durant la suppression de la reponse. Veuillez recommencer");
			}
			else
			{	
				// On renvoie � la page de liste des reponses avec un message d'erreur
				response.sendRedirect("administrationReponses?action=lister&succes=" + "La reponse � �t� supprim�e avec succ�s");
			}
		}
		else
		{
			// On renvoie � la page de liste des reponses avec un message d'erreur
			response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Cette reponse n'est pas r�f�renc�e dans la base");
		}
	}
	
	
	// Modifier une reponse
	private void modifier(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		int idReponse=0;
		Reponse reponse=null;
		List<Question> liste=null;
		ModeleQuestion modeleQuestion=null;
		ModeleReponse modeleReponse=null;
		
		try
		{
			// On r�cup�re l'id de la reponse
			idReponse=Integer.parseInt(request.getParameter("idReponse"));
		}
		catch (Exception e) 
		{
			// Si l'id de la reponse pass� en param�tre n'est pas un nombre, on initialise l'id � 0
			idReponse=0;
		}
		
		// On initialise les mod�les
		modeleReponse=new ModeleReponse(datasource);
		modeleQuestion=new ModeleQuestion(datasource);
		
		// On r�cup�re la reponse correspondant, renvoie null si l'id de la reponse n'existe pas dans la base
		reponse=(Reponse)modeleReponse.getReponse(idReponse);
		
		// Si l'objet reponse est null (id non trouv�) on renvoie sur la page de listing avec un message d'erreur
		if(reponse!=null)
		{
			// On r�cup�re la liste des questions depuis le mod�le
			liste=modeleQuestion.listeQuestion();
			
			// On renvoie � la vue la reponse � modifier
			request.setAttribute("reponse",reponse);
			
			// On place dans la requ�te la liste des questions
			request.setAttribute("questions", liste);
			
			// On vide les objets par s�curit�
			reponse=null;
			liste=null;
			
			// On renvoie � la vue de modification d'une reponse
			getServletContext().getRequestDispatcher("/vues/administrateurs/modifierreponse.jsp").forward(request,response);
		}
		else
		{
			// On renvoie � la page de liste des reponses avec un message d'erreur
			response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Cette reponse n'est pas r�f�renc�e dans la base");
		}
	}
	
	
	// Valider la modification d'une reponse
	private void validerModification(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		ModeleQuestion modeleQuestion=null;
		List<Question> listeQuestion=null;
		List<String> erreurs=null;
		Enumeration parametres=null;
		String parametre=null;
		String nom=null;
		String coefficient=null;
		
		// On r�cup�re les informations du formualire sur lesquels on va appliquer une validation
		nom=request.getParameter("nom").trim();
		coefficient=request.getParameter("coefficient").trim();

		// On ajoute tous les attributs du formulaire dans la requ�te pour les transf�rer � la vue
		parametres=request.getParameterNames();
		while (parametres.hasMoreElements()) 
		{
			parametre=(String)parametres.nextElement();
		    request.setAttribute(parametre,(String)request.getParameterValues(parametre)[0]);
		}
		
		// Initialisation de la collection d'erreurs
		erreurs=new ArrayList<String>();
		
		// On v�rifie que le nom est renseign�
		if(nom.trim().equals("") || nom==null)
		{
			erreurs.add("Le param�tre [nom] est vide");
		}
		else if (nom.trim().length()<5)
		{
			// Test de la longeur du nom (5 caract�re minimum)
			erreurs.add("Le param�tre [nom] doit contenir au moin 5 caract�res");
		}
		else if (!nom.trim().matches("^[\\p{L}\\s\\d-']{5,}$"))
		{
			erreurs.add("Le param�tre [nom] contient une erreur de syntaxe");
		}
		
		// On v�rifie que le coefficient est renseign�
		if(coefficient.trim().equals("") || coefficient==null)
		{
			erreurs.add("Le param�tre [coefficient] est vide");
		}
		else if(!coefficient.trim().matches("^(\\d){1,}((\\.){1,1}(\\d){1,2})?$"))
		{
			erreurs.add("Le param�tre [coefficient] contient une erreur de syntaxe");
		}
		
		// On regarde le nombre d'erreurs, s'il y en a au moins une on renvoie � la page de modification
		if(erreurs.size()>0)
		{	
			// On initialise le modele de question
			modeleQuestion=new ModeleQuestion(datasource);
			
			// On r�cup�re la liste des questions
			listeQuestion=modeleQuestion.listeQuestion();
			
			// On place la liste dans la requ�te
			request.setAttribute("question", listeQuestion);
			
			// On ajoute la collection d'erreurs
			request.setAttribute("erreurs", erreurs);
			
			// On renvoie � la vue de modification de la reponse
			getServletContext().getRequestDispatcher("/vues/administrateurs/modifierreponse.jsp").forward(request,response);
		}
		else
		{
			// On renvoie � la page de de modification de la vignette
			// getServletContext().getRequestDispatcher("/vues/administrateurs/modifierphoto.jsp").forward(request,response);
		}
	}
	
	
	
	// Finalisation de la modification de la reponse
	private void finaliserModification(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// Variables
		Reponse reponse=null;
		ModeleQuestion modeleQuestion=null;
		ModeleReponse modeleReponse=null;
		int codeErreur=0;
			
		// On initialise les mod�les
		modeleReponse=new ModeleReponse(this.datasource);
		modeleQuestion=new ModeleQuestion(this.datasource);
				
		// On initialise la reponse � modifier
		reponse=new Reponse();
				
		// On d�finit les attributs de la reponse avec les informations des deux formulaires pr�c�dents
		reponse.setId(Integer.parseInt(request.getParameter("id").trim()));
		reponse.setQuestion(modeleQuestion.getQuestion(Integer.parseInt(request.getParameter("question").trim())));
		reponse.setNom(request.getParameter("nom").trim());
		reponse.setCoefficient(Double.parseDouble(request.getParameter("coefficient").trim()));
		
		// On modifie la reponse dans la base de donn�es en passant par le mod�le
		codeErreur=modeleReponse.modifierReponse(reponse);
		
		// On vide l'objet reponse par s�curit�
		reponse=null;
			
		// On teste le code de retour pour afficher un message de succ�s ou d'erreur
		if(codeErreur!=1)
		{		
			// On renvoie � la page de liste des reponses avec un message d'erreur
			response.sendRedirect("administrationReponses?action=lister&erreurs=" + "Une erreur s'est produite durant la modification de la reponse, veuillez recommencer");
		}
		else
		{	
			// On renvoie � la page de liste des reponses avec un message d'erreur
			response.sendRedirect("administrationReponses?action=lister&succes=" + "La reponse � �t� modifi�e avec succ�s");
		}
	}
	
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
	{
		doGet(request, response);
	}
	
	
}